﻿using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SonarSnitch.Business.Entity
{
    public class Projeto
    {
        public Projeto(JToken jsProjeto)
        {
            Id = jsProjeto["id"].Value<int>();
            Codigo = jsProjeto["key"].Value<string>();
            Nome = jsProjeto["name"].Value<string>();
            Versao = jsProjeto["version"] != null ? jsProjeto["version"].Value<string>() : string.Empty;
            Descricao = jsProjeto["description"] != null ? jsProjeto["description"].Value<string>() : string.Empty;

            Metricas = new List<Resultado>();
            Intervalos = new List<Intervalo>();

            JArray array = (JArray)jsProjeto["msr"];
            if (array != null)
            {
                foreach (var item in array)
                {
                    Metricas.Add(new Resultado(item));
                }
            }
            CarregarFiltros();
        }

        public int Id { get; set; }
        public string Codigo { get; set; }
        public string Nome { get; set; }
        public string Versao { get; set; }
        public string Descricao { get; set; }

        public IList<Resultado> Metricas { get; set; }

        public IList<Intervalo> Intervalos { get; set; }

        public Resultado FiltrarMetrica(string tipo)
        {
            var metrica = Metricas.Where(m => m.Tipo.Equals(tipo)).FirstOrDefault();
            return metrica;
        }

        public Dictionary<string, string> Filtros;
        public void CarregarFiltros()
        {
            Filtros = new Dictionary<string, string>();
            foreach (var filtro in ConfigurationManager.AppSettings["filtros"].Split(','))
            {
                var metrica = FiltrarMetrica(filtro);
                Filtros.Add(filtro, metrica != null ? metrica.ValorFormatado : string.Empty);
            }
        }

        public Intervalo FiltrarIntervalo(string metrica)
        {
            return Intervalos.Where(i => i.Metrica.Equals(metrica)).FirstOrDefault();
        }

        public string ValorMetrica(string metrica)
        {
            var filtro = FiltrarMetrica(metrica);
            return filtro != null ? filtro.ValorFormatado : string.Empty;
        }

        public bool Configurado(string manualMeasure, string valor)
        {
            var filtro = FiltrarMetrica(manualMeasure);
            return filtro != null ? filtro.ValorFormatado.Equals(valor) : false;
        }

        public bool ExisteMedicao()
        {
            foreach (var item in Intervalos)
            {
                if (item.Avaliacao == AvaliacaoEnum.Inalterada ||
                    item.Avaliacao == AvaliacaoEnum.Positiva ||
                    item.Avaliacao == AvaliacaoEnum.Negativa)
                {
                    return true;
                }
            }
            return false;
        }
    }
}
